package com.example.learnvideo.ui

import android.content.Context
import android.content.Intent
import android.media.projection.MediaProjectionManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.learnvideo.MainApplication
import com.example.learnvideo.R
import com.example.learnvideo.base.BaseActivity
import com.example.learnvideo.databinding.ActivityScreenCaptureBinding
import com.example.learnvideo.service.CaptureService
import com.example.learnvideo.service.RecordService
import com.example.learnvideo.util.AuthorityUtil
import java.lang.Exception

class ScreenCaptureActivity : BaseActivity<ActivityScreenCaptureBinding>() {

    // 声明一个媒体投影管理器对象
    private lateinit var manager:MediaProjectionManager
    // 媒体投影授权的请求代码
    private val REQUEST_PROJECTION = 100
    // 结果意图
    private var mResultIntent:Intent? = null
    // 结果代码
    private var mResultCode = 0

    override fun ActivityScreenCaptureBinding.initBinding() {
        btnStartCapture.setOnClickListener {
            //停止录屏服务
            stopService(Intent(this@ScreenCaptureActivity,RecordService::class.java))
            //开启截图服务
            startCaptureService()
        }
        // 初始化媒体投影
        initMediaProjection()
    }

    // 初始化媒体投影
    private fun initMediaProjection(){
        // 从系统服务中获取媒体投影管理器
        manager = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
        // 从全局变量中获取结果意图
        mResultIntent = MainApplication.getInstance().mResultIntent
        // 从全局变量中获取结果代码
        mResultCode = MainApplication.getInstance().mResultCode
    }

    // 启动截图服务
    private fun startCaptureService(){
        // 不是首次截图或录屏
        if(mResultIntent!= null && mResultCode != 0){
            //版本为 Android 9 或更低版本,就调用 startService 方法按照普通方式启动后台的截屏服务。
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
                startService(Intent(this,CaptureService::class.java))
            }else{
                // 启动前台的截图服务（从Android10开始，媒体投影操作必须在前台服务中运行）
                startForegroundService(Intent(this,CaptureService::class.java))
            }
        }else{// 是首次截图或录屏
            try {
                // 弹出授权截图的对话框
                startActivityForResult(manager.createScreenCaptureIntent(),REQUEST_PROJECTION)
            } catch (e:Exception){
                e.printStackTrace()
                Toast.makeText(this,"当前系统不支持截屏功能",Toast.LENGTH_SHORT).show()
            }
        }
    }

    // 从授权截图的对话框返回时触发
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_PROJECTION && resultCode == RESULT_OK){// 允许授权
            // AppOpsManager.OP_SYSTEM_ALERT_WINDOW是隐藏变量（值为24），不能直接引用
            if (!AuthorityUtil.checkOp(this,24)){ // 未开启悬浮窗权限
                Toast.makeText(this,"截屏功能需要开启悬浮窗权限",Toast.LENGTH_SHORT).show()
                // 跳到悬浮窗权限的设置页面
                AuthorityUtil.requestAlertWindowPermission(this)
            }else{// 已开启悬浮窗权限
                mResultCode = resultCode
                mResultIntent = data
                // 下面把结果代码、结果意图等等信息保存到全局变量中
                MainApplication.getInstance().mResultCode = resultCode
                MainApplication.getInstance().mResultIntent = data
                MainApplication.getInstance().manager = manager
                //启动截图服务
                startCaptureService()
            }
        }
    }
}